package rhplus.utilizador;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import rhplus.acessoBD.PMF;
import rhplus.persistencia.ContaDeUtilizador;

@PersistenceCapable
public class Pessoa implements Serializable{

    // Atributos
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    protected Long id_pessoa;
    @Persistent
    protected String nome;
    @Persistent
    protected char sexo;
    @Persistent
    protected int bi;
    @Persistent
    protected Date data_de_nascimento;
    @Persistent
    protected int nif;
    @Persistent
    protected String email;
    @Persistent
    protected int telefone;
    @Persistent
    protected int telemovel;
    @Persistent
    protected String morada;
    @Persistent
    protected String grupo_sanguineo;
    @Persistent
    protected Long id_codigo_postal;

    /** Creates a new instance of Pessoa */
    public Pessoa(final String nome, final char sexo, final int bi,
            final Date data_de_nascimento, final int nif, final String email, final int telefone,
            final int telemovel, final String morada, final String grupo_sanguineo, final Long codigo_postal) {

        this.nome = nome;
        this.sexo = sexo;
        this.bi = bi;
        this.data_de_nascimento = data_de_nascimento;
        this.nif = nif;
        this.email = email;
        this.telefone = telefone;
        this.telemovel = telemovel;
        this.morada = morada;
        this.grupo_sanguineo = grupo_sanguineo;
        this.id_codigo_postal = codigo_postal;
    }

    public static void insere(final Pessoa pessoa) {
        
        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            pm.makePersistent(pessoa);
        } finally {
            pm.close();
        }
    }

    public static void altera(Pessoa pessoa) {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.currentTransaction().begin();
            // We don't have a reference to the selected Product.
            // So we have to look it up first,
            Pessoa p = pm.getObjectById(Pessoa.class, pessoa.getIdPessoa());

            p.setAll(pessoa);
            pm.makePersistent(pessoa);
            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public void setAll(Pessoa p) {
        this.bi = p.getBI();
        this.id_codigo_postal = p.getCodigoPostal();
        this.data_de_nascimento = p.getDataDeNascimento();
        this.email = p.getEmail();
        this.grupo_sanguineo = p.getGrupoSanguineo();
        this.morada = p.getMorada();
        this.nif = p.getNIF();
        this.nome = p.getNome();
        this.sexo = p.getSexo();
        this.telefone = p.getTelefone();
        this.telemovel = p.getTelemovel();
    }

    public static void remove(final Long id_pessoa) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

        PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.currentTransaction().begin();

            // We don't have a reference to the selected Product.
            // So we have to look it up first,
            Pessoa pessoa = pm.getObjectById(Pessoa.class, id_pessoa);
            pm.deletePersistent(pessoa);

            pm.currentTransaction().commit();
        } catch (Exception ex) {
            pm.currentTransaction().rollback();
            throw new RuntimeException(ex);
        } finally {
            pm.close();
        }
    }

    public static boolean temContaDeUtilzador(Long id_pessoa) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + ContaDeUtilizador.class.getName()
                + " where id_pessoa == " + id_pessoa;

          return !((List<Pessoa>) pm.newQuery(query).execute()).isEmpty();
    }

    public static Pessoa devolve(Long id) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Pessoa.class.getName()
                + " where id_pessoa == " + id;

        return ((List<Pessoa>) pm.newQuery(query).execute()).get(0);
    }

    public static Long devolveIdPessoaPorBI(int bi) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Pessoa.class.getName()
                + " where bi == " + bi;

        List<Pessoa> p = (List<Pessoa>) pm.newQuery(query).execute();

        return p.get(0).getIdPessoa();
    }

    public static boolean existeBI(int bi) {

        PersistenceManager pm = PMF.get().getPersistenceManager();

        String query = "select from " + Pessoa.class.getName()
                + " where bi == " + bi;

        return !((List<Pessoa>)pm.newQuery(query).execute()).isEmpty();
    }


    public Long getIdPessoa() {
        return id_pessoa;
    }

    public String getNome() {
        return nome;
    }

    public char getSexo() {
        return sexo;
    }

    public int getBI() {
        return bi;
    }

    public Date getDataDeNascimento() {
        return data_de_nascimento;
    }

    public int getNIF() {
        return nif;
    }

    public String getEmail() {
        return email;
    }

    public int getTelefone() {
        return telefone;
    }

    public int getTelemovel() {
        return telemovel;
    }

    public String getMorada() {
        return morada;
    }

    public String getGrupoSanguineo() {
        return grupo_sanguineo;
    }

    public Long getCodigoPostal() {
        return id_codigo_postal;
    }

    public void setNome(final String nome) {
        this.nome = nome;
    }

    public void setSexo(final char sexo) {
        this.sexo = sexo;
    }

    public void setBI(final int bi) {
        this.bi = bi;
    }

    public void setDataDeNascimento(final Date data_de_nascimento) {
        this.data_de_nascimento = data_de_nascimento;
    }

    public void setNIF(final int nif) {
        this.nif = nif;
    }

    public void setEmail(final String email) {
        this.email = email;
    }

    public void setTelefone(final int telefone) {
        this.telefone = telefone;
    }

    public void setTelemovel(final int telemovel) {
        this.telemovel = telemovel;
    }

    public void setMorada(final String morada) {
        this.morada = morada;
    }

    public void setGrupoSanguineo(final String grupo_sanguineo) {
        this.grupo_sanguineo = grupo_sanguineo;
    }

    public void setCodigoPostal(final Long codigo_postal) {
        this.id_codigo_postal = codigo_postal;
    }

    public String toString() {
        return id_pessoa + ";" + nome + ";" + sexo + ";" + bi + ";" + data_de_nascimento + ";" + nif + ";" + email + ";"
                + telefone + ";" + telemovel + ";" + morada + ";" + grupo_sanguineo + ";" + id_codigo_postal + ";";
    }

    public void setID(Long id) {
        this.id_pessoa =id;
    }

     public void adicionaDoencaPassada(DoencaPassada dados) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
         DoencaPassada.insere(dados);
    }

    public void adicionaTratamentoPassado(TratamentoPassado dados_do_tratamento_passado) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        TratamentoPassado.insere(dados_do_tratamento_passado);
    }

    public void alteraTratamentoPassado(TratamentoPassado dados_do_tratamento_passado) throws Exception{
        TratamentoPassado.altera(dados_do_tratamento_passado);
    }

    public void removeTratamentoPassado(Long id_tratamento_passado) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        TratamentoPassado.remove(id_tratamento_passado);
    }

    public void alteraDoencaPassada(DoencaPassada dados_da_doenca_passada) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        DoencaPassada.altera(dados_da_doenca_passada);
    }

    public void devolveDoencasPassadas(Long id_pessoa){


    }

   
}
